/**
 * SM2非对称加密工具类
 * 基于sm-crypto库实现，统一使用C1C3C2模式和十六进制格式
 */
import { sm2 } from "sm-crypto";

/**
 * 生成SM2密钥对
 * @returns {Object} 包含公钥和私钥的对象（十六进制）
 */
export function generateKeyPair(): {
  publicKey: string;
  privateKey: string;
} {
  // 调用sm-crypto库生成密钥对（十六进制）
  return sm2.generateKeyPairHex();
}

/**
 * SM2加密（C1C3C2模式）
 * @param {string} plainText 明文
 * @param {string} publicKey 公钥（十六进制）
 * @returns {string} 密文（十六进制）
 */
export function encrypt(plainText: string, publicKey: string): string {
  // 加密（返回C1C3C2模式的十六进制字符串，sm-crypto参数0表示C1C3C2）
  return sm2.doEncrypt(plainText, publicKey, 0);
}

/**
 * SM2解密（C1C3C2模式）
 * @param {string} cipherText 密文（十六进制）
 * @param {string} privateKey 私钥（十六进制）
 * @returns {string} 明文
 */
export function decrypt(cipherText: string, privateKey: string): string {
  // 解密（C1C3C2模式，sm-crypto参数0表示C1C3C2）
  return sm2.doDecrypt(cipherText, privateKey, 0);
}

/**
 * SM2签名
 * @param {string} message 待签名的消息
 * @param {string} privateKey 私钥（十六进制）
 * @returns {string} 签名结果（十六进制）
 */
export function sign(message: string, privateKey: string): string {
  // 签名（返回十六进制字符串，mode=0表示C1C3C2模式）
  return sm2.doSignature(message, privateKey, {
    hash: true,
    mode: 0
  });
}

/**
 * SM2验签
 * @param {string} message 原始消息
 * @param {string} signature 签名结果（十六进制）
 * @param {string} publicKey 公钥（十六进制）
 * @returns {boolean} 验签结果
 */
export function verify(
  message: string,
  signature: string,
  publicKey: string
): boolean {
  // 验签（mode=0表示C1C3C2模式）
  return sm2.doVerifySignature(message, signature, publicKey, {
    hash: true,
    mode: 0
  });
}
